/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.dpy.appmvdpy.Controllers;

import com.dpy.appmvdpy.Facades.ClientesFacade;
import com.dpy.appmvdpy.Facades.DefaultFacade;
import com.dpy.appmvdpy.Facades.FormaPagamentoFacade;
import com.dpy.appmvdpy.Facades.PedidosFacade;
import com.dpy.appmvdpy.Facades.ProdutosFacade;
import com.dpy.appmvdpy.Facades.ProdutosPedidosFacade;
import com.dpy.appmvdpy.Facades.VendedorFacade;
import com.dpy.appmvdpy.Helpers.PedidoChart;
import com.dpy.appmvdpy.Helpers.StaticSources;
import com.dpy.appmvdpy.Models.Clientes;
import com.dpy.appmvdpy.Models.Exporters.Exporter;
import com.dpy.appmvdpy.Models.Exporters.PedidoExporter;
import com.dpy.appmvdpy.Models.FormaPagamento;
import com.dpy.appmvdpy.Models.Lighters.ProdutosLight;
import com.dpy.appmvdpy.Models.Pedidos;
import com.dpy.appmvdpy.Models.Produtos;
import com.dpy.appmvdpy.Models.ProdutosPedidos;
import com.dpy.appmvdpy.Models.Validators.DefaultValidator;
import com.dpy.appmvdpy.Models.Validators.PedidosValidator;
import com.dpy.appmvdpy.Models.Vendedor;
import java.beans.PropertyEditorSupport;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.NotImplementedException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.format.annotation.NumberFormat;
import org.springframework.security.access.annotation.Secured;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.support.SessionStatus;
import org.springframework.web.servlet.ModelAndView;

/**
 *
 * @author Lilli
 */
@Controller
@RequestMapping("/pedidos")
@Secured("ROLE_USER")
public class PedidosController extends DefaultController<Pedidos> {
    
    private static int itemNumber = 1;
    
    public PedidosController()
    {
       super(Pedidos.class,"pedidos");    
    }    
    
    @Autowired
    private PedidosFacade facade;
    
    @Autowired
    private VendedorFacade vendedorFacade;
    
    @Autowired
    private ClientesFacade clientesFacade;
    
    @Autowired
    private ProdutosFacade produtosFacade;
    
    @Autowired
    private FormaPagamentoFacade formaFacade;
    
    @Autowired
    private PedidosValidator validator;
    
    @Autowired
    private PedidoChart pedidoChart;
    
    @Autowired
    private ProdutosPedidosFacade ppFacade;
    
    @Autowired
    public PedidoExporter exporter;
    
    
    @Override
    public DefaultFacade<Pedidos> getFacade() {
       return this.facade;
    }

    @Override
    public Pedidos createObject() {
        return new Pedidos();
    }

    @Override
    public DefaultValidator<Pedidos> getValidator() {
        return this.validator;
    }
 
    @Override
    @Secured("ROLE_USER")
    public ModelAndView create() {
        pedidoChart.destroyPedido();
        itemNumber = 1;
        ModelAndView model = super.create();
        Pedidos p = (Pedidos)model.getModel().get("model");
        
        User user = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        for(GrantedAuthority g: user.getAuthorities())
        {
            if("ROLE_USER".equals(g.getAuthority()))
            {
                Vendedor v = vendedorFacade.getVendedorByUser(user.getUsername());
                pedidoChart.getPedido().setVendedor(v);
                p.setVendedor(v);
                pedidoChart.getPedido().setCodigoDPY(facade.getLastCodigoDpy(v) + 1);
                p.setCodigoDPY(pedidoChart.getPedido().getCodigoDPY());
                model.addObject("clientes",clientesFacade.listByVendedorId(v.getId())); 
            }else
            {
               model.addObject("vendedor",vendedorFacade.listAll());       
               model.addObject("clientes",clientesFacade.listAll());
            }
            break;            
        }          
        pedidoChart.getPedido().setData(new Date());
        model.addObject("forma",formaFacade.listAll());
        model.getModel().remove("model");
        model.addObject("model",pedidoChart.getPedido());
        model.addObject("tamanhos",StaticSources.tamanhos());
       
        p.setData(Calendar.getInstance().getTime());
        if(p.getProdutosPedidosCollection() == null)
        p.setProdutosPedidosCollection(new ArrayList<ProdutosPedidos>());
        return model;
    }

   

    @Override
    @Secured("ROLE_USER")
    public ModelAndView create(@ModelAttribute("model")Pedidos model, BindingResult result, SessionStatus status) {
        if(model.getIntegrado() == null)
            model.setIntegrado(Boolean.FALSE);
        
        ModelAndView retorno = super.create(model, result, status);
        
        if("/pedidos/add".equals(retorno)) return retorno;
        
        itemNumber = 1;
        for(ProdutosPedidos p: pedidoChart.getPedido().getProdutosPedidosCollection())
        {
           p.setIdPedidos(model);
           p.setItemn(itemNumber++);
           ppFacade.add(p);
        }
        itemNumber = 1;
        pedidoChart.destroyPedido();
        return retorno;
    }
    
    @Override
    @Secured("ROLE_USER")
    public ModelAndView edit(int id) {     
       
        throw new NotImplementedException("");
        
        /* ModelAndView model = super.edit(id);
        model.addObject("vendedor",vendedorFacade.listAll());
        model.addObject("clientes",clientesFacade.listAll());
        model.addObject("forma",formaFacade.listAll());
        return model;*/
    }
    
    @InitBinder
    protected void initBinder(WebDataBinder binder) throws Exception {
        binder.registerCustomEditor(Vendedor.class, "vendedor", new PropertyEditorSupport() {

            @Override
            public String getAsText() {
                return getValue() == null ? "" : ((Vendedor) getValue()).getId().toString();
            }

            @Override
            public void setAsText(String text) throws IllegalArgumentException {
                Vendedor user = vendedorFacade.getById(Integer.valueOf(text));
                setValue(user);
            }
        });
        
         binder.registerCustomEditor(Clientes.class, "clientes", new PropertyEditorSupport() {

            @Override
            public String getAsText() {
                return getValue() == null ? "" : ((Clientes) getValue()).getId().toString();
            }

            @Override
            public void setAsText(String text) throws IllegalArgumentException {
                Clientes user = clientesFacade.getById(Integer.valueOf(text));
                setValue(user);
            }
        });
         
            binder.registerCustomEditor(FormaPagamento.class, "formaPagamento", new PropertyEditorSupport() {

            @Override
            public String getAsText() {
                return getValue() == null ? "" : ((FormaPagamento) getValue()).getId().toString();
            }

            @Override
            public void setAsText(String text) throws IllegalArgumentException {
                FormaPagamento user = formaFacade.getById(Integer.valueOf(text));
                setValue(user);
            }
        });
        
         binder.registerCustomEditor(Date.class, "data", new CustomDateEditor(new SimpleDateFormat("dd/MM/yyyy"), false));
    }
    
 @RequestMapping(value = "/sjauto", method = RequestMethod.GET )
 @ResponseBody
 public List<ProdutosLight> getAutoComplete(HttpServletRequest request,
   @RequestParam String name) {
   List<Produtos> sList = produtosFacade.listAll();   
   List<ProdutosLight> retorno = new ArrayList<ProdutosLight>();
  
   for(Produtos p:sList)
   {
      if(p.getReferencia().startsWith(name))
      {
      ProdutosLight pl = new ProdutosLight();
      pl.setId(p.getId());
      pl.setReferencia(p.getReferencia());
      pl.setPreco(p.getPreco());
      retorno.add(pl);
      }
   }
       
   return retorno;
 }
 
 @RequestMapping(value = "/excluiItem", method = { RequestMethod.GET,
   RequestMethod.POST })
 @ResponseBody
 public void excluiItem(HttpServletRequest request,
   @RequestParam int id) {
   
    List<ProdutosPedidos> prodPed = (List<ProdutosPedidos>) pedidoChart.getPedido().getProdutosPedidosCollection();
    
    for(int i = 0; i < prodPed.size(); i++)
    {
       if(prodPed.get(i).getItemn() == id)
       {
          prodPed.remove(i);
       }
    }
 }
 
  @RequestMapping(value = "/buscaCliente", method = { RequestMethod.GET,
   RequestMethod.POST })
 @ResponseBody
 public int buscaCliente(HttpServletRequest request,
   @RequestParam String cnpj) {
   
    Clientes c = clientesFacade.getClienteByCnpj(cnpj);
    if (c != null) pedidoChart.getPedido().setClientes(c);
    return c == null ? 0 : c.getId();
 }
  
 @RequestMapping(value = "/totalPedido", method = { RequestMethod.GET,
  RequestMethod.POST })
 @ResponseBody
 @NumberFormat(pattern="0.00")
 public Double getTotalPedido(HttpServletRequest request) {
   
    return pedidoChart.getPedido().getValorTotal();
 }
 
  @RequestMapping(value = "/totalQuant", method = { RequestMethod.GET,
  RequestMethod.POST })
 @ResponseBody
 public Double getTotalQuant(HttpServletRequest request) {
   
    return pedidoChart.getPedido().getQuantidadeTotal();
 }
 
  @RequestMapping(value = "/addItem", method = { RequestMethod.GET,
   RequestMethod.POST })
 @ResponseBody
 public ProdutosPedidos addItem(HttpServletRequest request,
   @RequestParam int idProduto, 
   @RequestParam double quantidade2,
   @RequestParam double quantidade4,
   @RequestParam double quantidade8,
   @RequestParam double quantidade10,
   @RequestParam double quantidade12,
   @RequestParam double quantidade14,
   @RequestParam double quantidade16,
   @RequestParam double quantidade18,
   @RequestParam double quantidadeP,
   @RequestParam double quantidadeM,
   @RequestParam double quantidadeG,
   @RequestParam double quantidadeGG,
   @RequestParam double quantidadeEG,
   @RequestParam double quantidadeXG,
   @RequestParam @NumberFormat(pattern="0.00") double preco,
   @RequestParam @NumberFormat(pattern="0.00") double precoTotal,
   @RequestParam String observacao) {
    
     try
     {  
         ArrayList<ProdutosPedidos> list = (ArrayList<ProdutosPedidos>) pedidoChart.getPedido().getProdutosPedidosCollection();
      
         list = list == null ? new ArrayList<ProdutosPedidos>() : list;
         pedidoChart.getPedido().setProdutosPedidosCollection(list);
         
         ProdutosPedidos col = new ProdutosPedidos();
       
         col.setIdPedidos(pedidoChart.getPedido());
         col.setIdPRODUTOS(produtosFacade.getById(idProduto));
         col.setPreco(preco);
         col.setQuantidade2(quantidade2);
         col.setQuantidade4(quantidade4);
         col.setQuantidade8(quantidade8);
         col.setQuantidade10(quantidade10);
         col.setQuantidade12(quantidade12);
         col.setQuantidade14(quantidade14);
         col.setQuantidade16(quantidade16);
         col.setQuantidade18(quantidade18);
         col.setQuantidadeP(quantidadeP);
         col.setQuantidadeM(quantidadeM);
         col.setQuantidadeG(quantidadeG);
         col.setQuantidadeGG(quantidadeGG);
         col.setQuantidadeEG(quantidadeEG);
         col.setQuantidadeXG(quantidadeXG);
         col.setPrecoTotal(precoTotal);
         col.setObservacao(observacao);
         col.setItemn(itemNumber++);
         list.add(col);
        return col;
     }catch(Exception e)
     {   
         System.out.println(e.getMessage());
        return null;
     }
 
   }

    @Override
    @Secured("ROLE_USER")
    public ModelAndView list(@RequestParam(required=false,defaultValue="0")int pag) {
        ModelAndView model = super.list(pag);
        boolean isAdmin = false;
        
        User user = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        for(GrantedAuthority g: user.getAuthorities())
        {
            if("ROLE_ADMIN".equals(g.getAuthority()))
            {
                isAdmin = true;
            }
            break;
            
        }
        
        if(!isAdmin)
        {
            model.getModel().remove("listModel");
            Vendedor v = vendedorFacade.getVendedorByUser(user.getUsername()); 
            model.addObject("listModel").addObject(v);          
        }
        return model;
    }

    @Override
    @Secured("ROLE_USER")
    public ModelAndView delete(int id) {
        return super.delete(id);
    }

    @Override
    @Secured("ROLE_USER")
    public ModelAndView detail(int id) {
        return super.detail(id);
    }

    @Override
    @Secured("ROLE_USER")
    public ModelAndView search(String name) {
        return super.search(name);
    }

    @Override
    public Exporter<Pedidos> getExporter() {
        //File f = new File("pedido-" + (new Date()).toString().replace(":", "-") + ".txt");
        File f = new File("PEDIDO.TXT");
        exporter.setFile(f);
        return exporter;
    }   
    
 }

